package com.wjyf.reducing_bento.config;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.CacheLoader;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.google.common.util.concurrent.RateLimiter;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;


import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import java.util.concurrent.TimeUnit;

/**
 * @Author: lrk
 * @Date: 2023/3/31 下午 1:25
 * @Description:
 */
//@ConfigurationProperties("spring")
@ConfigurationProperties(prefix = "spring.caffeine")
@Log4j2
@Component
@Setter
public class CaffeineConfig {

    private Integer initialCapacity;

    private Long maximumSize;

    private Long expireAfterWrite;

    @Bean
    public Cache<String, String> codeCache() {
        return Caffeine.newBuilder()
                // 指定初始容量
                .initialCapacity(initialCapacity)
                // 指定最大容量
                .maximumSize(maximumSize)
                // 指定写入30分钟后过期
                .expireAfterWrite(expireAfterWrite, TimeUnit.MINUTES)
                // 指定每隔1分钟刷新下数据内容，这个使用来刷新数据的
                //.refreshAfterWrite(1L, TimeUnit.MINUTES)
                // 监听记录移除事件
                .removalListener((key, value, cause) -> log.info("key:{}  value:{} 移除原因：{}", key, value, cause))
                // 开启缓存操作数据统计
                .recordStats()
                .build();
    }

    @Bean
    public Cache<String, RateLimiter> ipCache() {
        return Caffeine.newBuilder()
                // 指定最大容量
                .maximumSize(maximumSize)
                // 指定写入30s后过期
                .expireAfterWrite(expireAfterWrite, TimeUnit.SECONDS)
                // 监听记录移除事件
                .removalListener((key, value, cause) -> log.info("key:{}  value:{} 移除原因：{}", key, value, cause))
                .build();
    }

}
